#ifdef __cplusplus
#include <iostream>
#else
#include <stdio.h>
#include <stdlib.h>
#endif

#ifndef __COMMON_LIST_H_
#define __COMMON_LIST_H_

#ifdef __cplusplus
extern "C" {
#endif

struct ListNode {
  int val;
  struct ListNode *next;
};

/**
 * @brief 生成链表
 *
 * 根据给定的节点数量 n，生成一个包含 n 个节点的链表，并返回链表的头节点。
 *
 * @param n 节点数量
 *
 * @return 链表的头节点
 */
static inline struct ListNode *generate_list(size_t n) {
  struct ListNode *head;
  struct ListNode **p = &head;
  for (size_t i = 0; i < n; i++) {
    *p = (struct ListNode *)malloc(sizeof(*head));
    (*p)->val = i;
    (*p)->next = 
#ifdef __cplusplus
      nullptr;
#else
      NULL;
#endif
    p = &((*p)->next);
  }
  return head;
}

static inline struct ListNode *generate_list_val(size_t n, int *val) {
  struct ListNode *head;
  struct ListNode **p = &head;
  for (size_t i = 0; i < n; i++) {
    *p = (struct ListNode *)malloc(sizeof(*head));
    (*p)->val = val[i];
    (*p)->next = 
#ifdef __cplusplus
      nullptr;
#else
      NULL;
#endif
    p = &((*p)->next);
  }
  return head;
}

static inline struct ListNode *generate_cycle_list(size_t n, size_t cycle) {
  if (cycle > n) return 
#ifdef __cplusplus
      nullptr;
#else
      NULL;
#endif

  struct ListNode *head = generate_list(n);

  struct ListNode *tail = head;
  struct ListNode *cycle_point = head;

  while (tail->next) {
    tail = tail->next;
    if (cycle > 1) {
      cycle--;
      cycle_point = cycle_point->next;
    }
  }
  tail->next = cycle_point;
  return head;
}

/**
 * @brief 打印链表
 *
 * 将给定的链表节点从头开始逐个打印链表节点的值，每个值后面跟随一个逗号和空格。
 * 打印完成后换行。
 *
 * @param head 链表头节点指针
 */
static inline void print_list(struct ListNode *head) {
#ifdef __cplusplus
  std::cout << "\n-------------" << std::endl;
#else
  printf("\n-------------\n");
  fflush(stdout);
#endif
  int cnt = 0;
  while (head) {
#ifdef __cplusplus
    std::cout << head->val << ", ";
#else
    printf("%d, ", head->val);
    fflush(stdout);
#endif
    head = head->next;

    if (cnt++ > 40) {
#ifdef __cplusplus
      std::cout << "Maybe a cycle list!" << std::endl;
#else
      printf("Maybe a cycle list!\n");
      fflush(stdout);
#endif
      break;
    }
  }
#ifdef __cplusplus
  std::cout << std::endl;
#else
  printf("\n");
#endif
}

#ifdef __cplusplus
}
#endif

#endif  // __COMMON_LIST_H